package club.jdiy.core.base;

import club.jdiy.core.base.domain.DBEntity;
import org.springframework.data.repository.Repository;

import java.util.List;

/**
 * JDiy Dao层通用接口
 * @param <T> Entity类
 * @param <ID> 实体类的主键类型
 *
 * @author ziquee(子秋) QQ号:39886616 主页: http://www.jdiy.club
 * @version 20210309
 */
public interface JDiyDao<T extends DBEntity<ID>, ID> extends JpaDyn<T, ID>, Repository<T, ID> {

    /**
     * 这是一个实用的数据库记录替换更新的持久化方法，把一个List列表数据替换为另一个List．<br/>
     * <br/>主要用在一对多的（多方）List数据的更新上．<br/>
     * 若新List与旧List存在并集（即有一些id相同的记录），JPA不能简单的直接移除全部旧List后再重新插入新List（并集数据会报错）.<br/>
     * 使用此方法可避免这种错误并快速完成这种替换更新．<br/>
     *
     * @param oldList 旧的实体列表
     * @param newList 新的实体列表
     * @return 经持久化后的newList
     */
    @SuppressWarnings("unused")
    default List<T> replaceList(List<T> oldList, List<T> newList) {
        if (oldList == null || oldList.size() < 1) {
            if (newList != null) saveAll(newList);
        } else if (newList == null || newList.size() < 1) {
            for (T n : oldList) delete(n);
        } else {
            for (T n : newList) {
                oldList.removeIf(r -> r.getId().equals(n.getId()));
                save(n);
            }
            for (T r : oldList) delete(r);
        }
        return newList;
    }
}